#include"DList.h"

//链表的初始化和销毁
void DLInit(DLNode** pphead)
{
    *pphead=(DLNode*)malloc(sizeof(DLNode));
    if(*pphead==NULL)//判断是否申请成功
    {
        perror("malloc");
        return ;
    }
    (*pphead)->data=-1;//哨兵位
    (*pphead)->next=(*pphead)->prev=*pphead;
}
DLNode* DLInit2()
{
    DLNode* phead=(DLNode*)malloc(sizeof(DLNode));
    if(phead==NULL)//判断是否申请成功
    {
        perror("malloc");
        return NULL;
    }
    phead->data=-1;
    phead->next=phead->prev=phead;
    return phead;
}
//打印
void DLPrint(DLNode* phead)
{
    DLNode* cur=phead->next;
    while(cur!=phead)
    {
        printf("%d-->",cur->data);
        cur=cur->next;
    }
    printf ("\n");
}

//申请新节点
DLNode* ListBynode(DLDataType x)
{
    DLNode* node=(DLNode*)malloc(sizeof(DLNode));
    node->data=x;
    node->next=node->prev=NULL;
    return node;
}
//插入删除
void DLPushBack(DLNode* phead,DLDataType x)
{
    assert(phead);//哨兵位不能为空
    DLNode* node=ListBynode(x);
    node->next=phead;
    node->prev=phead->prev;
    phead->prev->next=node;
    phead->prev=node;
}
void DLPushFront(DLNode* phead,DLDataType x)
{
    assert(phead);
    DLNode* node=ListBynode(x);
    phead->next->prev=node;
    node->next=phead->next;
    node->prev=phead;
    phead->next=node;
}
void DLPopBack(DLNode* phead)
{
    assert(phead);
    //链表不能为空
    assert(phead->next!=phead);
    phead->prev=phead->prev->prev;
    free(phead->prev->next);
    phead->prev->next=phead;
}
void DLPopFront(DLNode* phead)
{
    assert(phead);
    assert(phead->next!=phead);
    phead->next=phead->next->next;
    free(phead->next->prev);
    phead->next->prev=phead;
}

//查找节点
DLNode* DLFind(DLNode* phead,DLDataType x)
{
    assert(phead);
    DLNode* cur=phead->next;
    while(cur!=phead)
    {
        if(cur->data==x)
            return cur;
        cur=cur->next;
    }
    return NULL;
}
//pos插入删除
void DLInsert(DLNode* pos,DLDataType x)
{
    assert(pos);
    DLNode* node= ListBynode(x);
    node->next=pos->next;
    node->prev=pos;
    pos->next=node;
    node->next->prev=node;
}   
void DLErase(DLNode* pos)
{
    assert(pos);
    pos->next->prev=pos->prev;
    pos->prev->next=pos->next;
    free(pos);
    pos=NULL;
}
//销毁
void DLDestory(DLNode* phead)
{
    assert(phead);
    DLNode* cur=phead;
    while(cur!=phead)
    {
        DLNode* next=cur;
        free(cur);
        cur=next;
    }
    free(phead);
    phead=NULL;
}
